﻿using AppManager.Model;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.Remoting.Messaging;
using System.Text;
using System.Threading.Tasks;
using System.Transactions;

namespace AppManager.BLL
{
    /// <summary>
    /// 我要把所有的邏輯都寫到这一层来
    /// </summary>
    public class ConnectBLL : BaseBLL<Connect>
    {
        /// <summary>
        /// 删除离线設備
        /// </summary>
        /// <param name="conenctionId"></param>
        /// <param name="isConnect"></param>
        public static void UpdateIsConnect(string conenctionId, bool isConnect = false)
        {
            Db.Current.Database.ExecuteSqlCommand("delete from connect where connectionId={0}", conenctionId);
        }

        /// <summary>
        /// 如果沒喲就添加，否則就修改狀態isconnected=true
        /// </summary>
        /// <param name="adminConnectionIds">需要關閉的admin的connectionid 集合</param>
        /// <returns></returns>
        public static new bool AddOrUpdate(Connect connect, out List<string> adminConnectionIds)
        {
            adminConnectionIds = new List<string>();
            //根據conenctionId來判斷

            //1.限制只有一個admin用戶
            if (connect.IsAdmin)
            {
                //記錄需要關閉的admin用戶的connectionId,然後調用Stop方法關閉
                adminConnectionIds = ConnectBLL.GetList(s => s.DeviceStr == "console" && s.IsAdmin).Select(s => s.ConnectionId).ToList();
            }

            //2.添加普通用戶,根據deviceStr判斷,數據庫中只記錄這台設備最後的connectionId,主要是為了避免接收時收到多條消息

            //這裡只能解決普通用戶只接受一條消息的問題,不能解決多個console發送多次的問題
            Db.Current.Database.ExecuteSqlCommand("delete from Connect where devicestr={0}", connect.DeviceStr);
            Add(connect);

            //3.刪除離線設備,
            //本身是否刪除對程序的執行并沒有任何影響,因為Connect這個表本身就是為了方便調試看到內存中的數據而存在的,但是又會有些影響
            //todo 思路1:是服務器每隔幾秒鐘,發送一個短的數據到用戶,然後用戶調用回饋代碼,可以添加一個字段叫做下次刪除時間(nextDeleteTime),然後是一個有回饋的話nextDeleteTime+=1min,下次再利用nextDeleTime繼續上面的動作,其他如果掉線了,就不會更新nextDeleteTime,也就在下次發送時超時了,自然刪除即可
            return true;
        }
    }
}
